gl renderer: Keep track of color matrix op state
authorTimm Bäder <mail@baedert.org>
Sun, 3 Dec 2017 18:15:33 +0000 (19:15 +0100)
committerTimm Bäder <mail@baedert.org>
Thu, 21 Dec 2017 18:12:31 +0000 (19:12 +0100)
gsk/gl/gskglrenderer.c
gsk/gl/gskglrenderops.c
gsk/gl/gskglrenderopsprivate.h

index 5f8fe95ba882edcf5c185f87f4ae3aeb9f066e77..313d730672a5234c8e0862441c0398b137112235 100644 (file)
@@ -1102,16 +1102,15 @@ gsk_gl_renderer_add_render_ops (GskGLRenderer   *self,
       {
         int texture_id;
         gboolean is_offscreen;
-        RenderOp op;
+
         add_offscreen_ops (self, builder, min_x, max_x, min_y, max_y,
                            gsk_color_matrix_node_get_child (node),
                            &texture_id, &is_offscreen);
 
         ops_set_program (builder, &self->color_matrix_program);
-        op.op = OP_CHANGE_COLOR_MATRIX;
-        op.color_matrix.matrix = *gsk_color_matrix_node_peek_color_matrix (node);
-        op.color_matrix.offset = *gsk_color_matrix_node_peek_color_offset (node);
-        ops_add (builder, &op);
+        ops_set_color_matrix (builder,
+                              gsk_color_matrix_node_peek_color_matrix (node),
+                              gsk_color_matrix_node_peek_color_offset (node));
 
         ops_set_texture (builder, texture_id);
 
index 3c97d94855f3abc0c3a49ddbf158dc474cbe8876..517ce851c46f6306f2919223457eb80789659102 100644 (file)
@@ -247,6 +247,30 @@ ops_set_color (RenderOpBuilder *builder,
   g_array_append_val (builder->render_ops, op);
 }
 
+void
+ops_set_color_matrix (RenderOpBuilder         *builder,
+                      const graphene_matrix_t *matrix,
+                      const graphene_vec4_t   *offset)
+{
+  RenderOp op;
+
+  if (memcmp (matrix,
+              &builder->program_state[builder->current_program->index].color_matrix.matrix,
+              sizeof (graphene_matrix_t)) == 0 &&
+      memcmp (offset,
+              &builder->program_state[builder->current_program->index].color_matrix.offset,
+              sizeof (graphene_vec4_t)) == 0)
+    return;
+
+  builder->program_state[builder->current_program->index].color_matrix.matrix = *matrix;
+  builder->program_state[builder->current_program->index].color_matrix.offset = *offset;
+
+  op.op = OP_CHANGE_COLOR_MATRIX;
+  op.color_matrix.matrix = *matrix;
+  op.color_matrix.offset = *offset;
+  g_array_append_val (builder->render_ops, op);
+}
+
 void
 ops_draw (RenderOpBuilder     *builder,
           const GskQuadVertex  vertex_data[GL_N_VERTICES])
index 087bf1dd62b3edb5900a756847bae78ab017a585..2245fd311ae75e9818cdc998cdf987de3244816a 100644 (file)
@@ -175,6 +175,10 @@ typedef struct
     /* Per-program state */
     union {
       GdkRGBA color;
+      struct {
+        graphene_matrix_t matrix;
+        graphene_vec4_t offset;
+      } color_matrix;
     };
   } program_state[GL_N_PROGRAMS];
 
@@ -197,31 +201,35 @@ typedef struct
 
 
 
-void              ops_set_program       (RenderOpBuilder         *builder,
-                                         const Program           *program);
+void              ops_set_program        (RenderOpBuilder         *builder,
+                                          const Program           *program);
 
-GskRoundedRect    ops_set_clip          (RenderOpBuilder         *builder,
-                                         const GskRoundedRect    *clip);
+GskRoundedRect    ops_set_clip           (RenderOpBuilder         *builder,
+                                          const GskRoundedRect    *clip);
 
-graphene_matrix_t ops_set_modelview     (RenderOpBuilder         *builder,
-                                         const graphene_matrix_t *modelview);
+graphene_matrix_t ops_set_modelview      (RenderOpBuilder         *builder,
+                                          const graphene_matrix_t *modelview);
 
-graphene_matrix_t ops_set_projection    (RenderOpBuilder         *builder,
-                                         const graphene_matrix_t *projection);
+graphene_matrix_t ops_set_projection     (RenderOpBuilder         *builder,
+                                          const graphene_matrix_t *projection);
 
-graphene_rect_t   ops_set_viewport      (RenderOpBuilder         *builder,
-                                         const graphene_rect_t   *viewport);
+graphene_rect_t   ops_set_viewport       (RenderOpBuilder         *builder,
+                                          const graphene_rect_t   *viewport);
 
-void              ops_set_texture       (RenderOpBuilder         *builder,
-                                         int                      texture_id);
+void              ops_set_texture        (RenderOpBuilder         *builder,
+                                          int                      texture_id);
 
-int               ops_set_render_target (RenderOpBuilder         *builder,
-                                         int                      render_target_id);
+int               ops_set_render_target  (RenderOpBuilder         *builder,
+                                          int                      render_target_id);
 
-float             ops_set_opacity        (RenderOpBuilder        *builder,
-                                          float                   opacity);
-void              ops_set_color          (RenderOpBuilder        *builder,
-                                          const GdkRGBA          *color);
+float             ops_set_opacity        (RenderOpBuilder         *builder,
+                                          float                    opacity);
+void              ops_set_color          (RenderOpBuilder         *builder,
+                                          const GdkRGBA           *color);
+
+void              ops_set_color_matrix   (RenderOpBuilder         *builder,
+                                          const graphene_matrix_t *matrix,
+                                          const graphene_vec4_t   *offset);
 
 void              ops_draw               (RenderOpBuilder        *builder,
                                           const GskQuadVertex     vertex_data[GL_N_VERTICES]);